/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.orderoid.webservice;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.jws.WebService;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.ejb.Stateless;
import org.orderoid.ejb.domain.*;
import org.orderoid.ejb.exceptions.MetierException;
import org.orderoid.ejb.exceptions.TechniqueException;
import org.orderoid.ejb.facade.*;

/**
 *
 * @author Didier
 */
@WebService(serviceName = "OrderoidAndroidWS")
@Stateless()
public class OrderoidAndroidWS {
    
    @EJB
    private RestaurantFacade restaurantFacade;
    @EJB
    private ClientFacade clientFacade;
    @EJB
    private ProduitFacade produitFacade;
    @EJB
    private MenuFacade menuFacade;
    @EJB
    private CommandeFacade commandeFacade;
    @EJB
    private AdresseFacade adresseFacade;

    /**
     * This is a sample web service operation
     */
    @WebMethod(operationName = "hello")
    public String hello(@WebParam(name = "name") String txt) {
        return "Hello " + txt + " !";
    }
    
    @WebMethod(operationName = "authentifierClient")
    public Client authentifierClient(@WebParam(name = "login") String login,
            @WebParam(name = "password") String password) throws TechniqueException, MetierException {
        
        return clientFacade.checkPassword(login, password);
    }
    
    @WebMethod(operationName = "inscrireClient")
    public Client inscrireClient(@WebParam(name = "nom") String nom, 
    @WebParam(name = "prenom") String prenom, @WebParam(name = "telephone") String telephone, 
    @WebParam(name = "civilite") String civilite, 
    @WebParam(name = "email") String email, @WebParam(name = "adresse") String adresse, 
    @WebParam(name = "adresseComplement") String adresseComplement, 
    @WebParam(name = "codePostal") String codePostal, @WebParam(name = "ville") String ville, 
    @WebParam(name = "password") String password) {
        
        Civilite civ = new Civilite();
        if(civilite.equals("M.")){
            civ.setIdCivilite(1);
        } else if(civilite.equals("Mme")){
            civ.setIdCivilite(2);
        } else {
            civ.setIdCivilite(3);
        } 
        Client client = new Client(null, nom, prenom, telephone, email, password);
        client.setIdCivilite(civ);
     
        Integer idClientBase = clientFacade.inscrire(client);
        
        Client clientCree = clientFacade.find(idClientBase);
        Adresse adresseACree = new Adresse(null, adresse, adresseComplement, codePostal, ville);
        adresseACree.setIdClient(clientCree);
        adresseFacade.create(adresseACree);
        
        return clientCree;
    }
    
    @WebMethod(operationName = "getAdresse")
    public Adresse getAdresse(@WebParam(name = "idClient") String idClient){
        return adresseFacade.findByIdClient(Integer.valueOf(idClient));
    }
    
    @WebMethod(operationName = "modifierClient")
    public Client modifierClient(@WebParam(name = "idClient") String idClient, 
    @WebParam(name = "nom") String nom,     
    @WebParam(name = "prenom") String prenom, @WebParam(name = "telephone") String telephone, 
    @WebParam(name = "civilite") String civilite, 
    @WebParam(name = "email") String email, @WebParam(name = "adresse") String adresse, 
    @WebParam(name = "adresseComplement") String adresseComplement, 
    @WebParam(name = "codePostal") String codePostal, @WebParam(name = "ville") String ville, 
    @WebParam(name = "password") String password) {
        
        Civilite civ = new Civilite();
        if(civilite.equals("M.")){
            civ.setIdCivilite(1);
        } else if(civilite.equals("Mme")){
            civ.setIdCivilite(2);
        } else {
            civ.setIdCivilite(3);
        } 
        Client client = new Client(Integer.valueOf(idClient), nom, prenom, telephone, email, password);
        client.setIdCivilite(civ);
     
        clientFacade.edit(client);
        
        Client clientModif = clientFacade.find(Integer.valueOf(idClient));   
        
        Adresse adresseAModifier = adresseFacade.findByIdClient(Integer.valueOf(idClient));
        adresseAModifier.setIdClient(clientModif);
        adresseAModifier.setAdresse(adresse);
        adresseAModifier.setAdresseComplement(adresseComplement);
        adresseAModifier.setCodePostal(codePostal);
        adresseAModifier.setVille(ville);
        adresseFacade.edit(adresseAModifier);
        
        return clientModif;
    }
    
    @WebMethod(operationName = "rechercherRestaurants")
    public List<Restaurant> rechercherRestaurants() {
        List<Restaurant> restaurants = restaurantFacade.findAll();
        for (Restaurant resto : restaurants) {
            resto.setMenuCollection(null);
            resto.setProduitCollection(null);
        }
        return restaurants;
    }
    
    @WebMethod(operationName = "getEtatCommande")
    public StatutCommande getEtatCommande(@WebParam(name = "idCommande") String idCommande) {
        Commande commande = commandeFacade.find(Integer.valueOf(idCommande));
        return commande.getIdStatut();
    }
    
    @WebMethod(operationName = "getListeCommande")
    public List<Commande> getListeCommande(@WebParam(name = "login") String login) {
        List<Commande> liste = null;
        Client client = clientFacade.findByEmail(login);
        if(client != null){
            liste = commandeFacade.listerCommandesByClient(client.getIdClient());
        }
        return liste;
    }
    
    @WebMethod(operationName = "rechercherProduits")
    public List<Produit> rechercherProduits(@WebParam(name = "idRestaurant") String idRestaurant) {
        return produitFacade.findAllActif(Integer.valueOf(idRestaurant));
    }
    
    @WebMethod(operationName = "rechercherMenus")
    public List<Menu> rechercherMenus(@WebParam(name = "idRestaurant") String idRestaurant) {
        return menuFacade.findAllActif(Integer.valueOf(idRestaurant));
    }
    
    @WebMethod(operationName = "commander")
    public Boolean commander(@WebParam(name = "menus") String menus,
            @WebParam(name = "produits") String produits,
            @WebParam(name = "idAdresse") String idAdresse,
            @WebParam(name = "idClient") String idClient,
            @WebParam(name = "idRestaurant") String idRestaurant) 
            throws TechniqueException, MetierException {
        
        if (idRestaurant == null) {
            throw new MetierException("Veuillez choisir un restaurant");
        }
        
        if (idClient == null) {
            throw new MetierException("Aucun client n'est associé à cette commande");
        }
        
        if (idAdresse == null) {
            throw new MetierException("Aucune adresse n'est associée à cette commande");
        }
        
        Commande commande = new Commande();
        commande.setIdCommande(Integer.MIN_VALUE);
        Adresse ad = new Adresse(Integer.valueOf(idAdresse));
        commande.setIdAdresse(ad);
        Restaurant resto = new Restaurant(Integer.valueOf(idRestaurant));
        commande.setIdRestaurant(resto);
        Client client = new Client(Integer.valueOf(idClient));
        commande.setIdClient(client);
        
        String[] idMenus = menus.split(";");
        String[] idProduits = produits.split(";");
        if (idMenus.length == 0 || idProduits.length == 0) {
            throw new MetierException("Veuillez choisir un produit ou un menu");
        }
        
        List<Menu> menuListe = new ArrayList<Menu>();
        for(String id : idMenus){
            menuListe.add(new Menu(Integer.valueOf(id)));
        }
        commande.setMenuCollection(menuListe);
        List<Produit> produitListe = new ArrayList<Produit>();
        for(String id : idProduits){
            produitListe.add(new Produit(Integer.valueOf(id)));
        }
        commande.setProduitCollection(produitListe);
        //statut
        StatutCommande statut = new StatutCommande(1);
        commande.setIdStatut(statut);
        
        //date du jour
        commande.setDateCommande(new Date());
        
        //ajout de 30 minutes
        Calendar c = new GregorianCalendar();
        c.add(Calendar.MINUTE, 30);
        Date dateLivraison = c.getTime();
        commande.setDateLivraison(dateLivraison);
        
        //montant total
        Double total = Double.valueOf(0);
        Menu menuBase = null;
        for(Menu menuSelect : commande.getMenuCollection()){
            menuBase = menuFacade.find(menuSelect.getIdMenu());
            total += menuBase.getMontant();
        }
        Produit produitBase = null;
        for(Produit produitSelect : commande.getProduitCollection()){
            produitBase = produitFacade.find(produitSelect.getIdProduit());
            total += produitBase.getMontant();
        }
        commande.setMontant(total);
        
        commandeFacade.create(commande);
        return true;
    }
    
    @WebMethod(operationName = "commanderAvecDateLivraison")
    public Boolean commanderAvecDateLivraison(@WebParam(name = "menus") String menus,
            @WebParam(name = "produits") String produits,
            @WebParam(name = "idAdresse") String idAdresse,
            @WebParam(name = "idClient") String idClient,
            @WebParam(name = "idRestaurant") String idRestaurant,
            @WebParam(name = "dateLivraison") String dateLivraison) 
            throws TechniqueException, MetierException {
        
        if (idRestaurant == null) {
            throw new MetierException("Veuillez choisir un restaurant");
        }
        
        if (idClient == null) {
            throw new MetierException("Aucun client n'est associé à cette commande");
        }
        
        if (idAdresse == null) {
            throw new MetierException("Aucune adresse n'est associée à cette commande");
        }
        
        Commande commande = new Commande();
        Adresse ad = new Adresse(Integer.valueOf(idAdresse));
        commande.setIdAdresse(ad);
        Restaurant resto = new Restaurant(Integer.valueOf(idRestaurant));
        commande.setIdRestaurant(resto);
        Client client = new Client(Integer.valueOf(idClient));
        commande.setIdClient(client);
        
        String[] idMenus = menus.split(";");
        String[] idProduits = produits.split(";");
        if (idMenus.length == 0 || idProduits.length == 0) {
            throw new MetierException("Veuillez choisir un produit ou un menu");
        }
        
        List<Menu> menuListe = new ArrayList<Menu>();
        for(String id : idMenus){
            menuListe.add(new Menu(Integer.valueOf(id)));
        }
        commande.setMenuCollection(menuListe);
        List<Produit> produitListe = new ArrayList<Produit>();
        for(String id : idProduits){
            produitListe.add(new Produit(Integer.valueOf(id)));
        }
        commande.setProduitCollection(produitListe);
        
        //date livraison
        SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            commande.setDateLivraison(sf.parse(dateLivraison));
        } catch (ParseException ex) {
            
            //Ajout de 30 Minutes
            Calendar c = new GregorianCalendar();
            c.add(Calendar.MINUTE, 30);
            commande.setDateLivraison(c.getTime());
        }
        
        //statut
        StatutCommande statut = new StatutCommande(1);
        commande.setIdStatut(statut);
        
        //date du jour
        commande.setDateCommande(new Date());
        
        //montant total
        Double total = Double.valueOf(0);
        Menu menuBase = null;
        for(Menu menuSelect : commande.getMenuCollection()){
            menuBase = menuFacade.find(menuSelect.getIdMenu());
            total += menuBase.getMontant();
        }
        Produit produitBase = null;
        for(Produit produitSelect : commande.getProduitCollection()){
            produitBase = produitFacade.find(produitSelect.getIdProduit());
            total += produitBase.getMontant();
        }
        commande.setMontant(total);
        
        commandeFacade.create(commande);
        return true;
    }
}
